package io.renren.common.utils;

import com.alibaba.druid.util.StringUtils;
import io.renren.common.exception.RRException;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 文件上传工具类
 */
@Component
public class UploadUtil {
    /**
     * 映射地址
     */
    private static String mapperPath;
    @Value("${web.virtual-path}")
    public void setMapperPath(String mapperPath) {
        UploadUtil.mapperPath = mapperPath;
    }
    /**
     * 实际地址
     */
    private static String realPath;
    @Value("${web.upload-path}")
    public void setRealPath(String realPath) {
        UploadUtil.realPath = realPath;
    }
    private static List<String> imgTypeList = new ArrayList<String>() {{
        add("jpg");
        add("jpeg");
        add("png");
        add("gif");
        add("bmp");
        add("svg");
    }};
    private static List<String> wordTypeList = new ArrayList<String>() {{
        add("doc");
        add("docx");
        add("xlsx");
        add("xls");
        add("cvs");
        add("pdf");
        add("txt");
    }};
    /**
     * 保存文件
     *
     * @param file       多个文件
     * @param userAuditPath 用户id
     * @param type       文件类型
     * @return 文件的映射地址
     * @throws IOException
     */
    public static String saveFile(MultipartFile file, String userAuditPath, FileType type) throws RRException, IOException {
        if (null == file || file.isEmpty()) {
            throw new RRException("上传的文件对象不存在");
        }
        // 文件名
        String fileName = file.getOriginalFilename();
        // 文件后缀名
        String extName = FilenameUtils.getExtension(fileName);
        if (StringUtils.isEmpty(extName)) {
            throw new RRException("文件类型未定义不能上传");
        }
        // 判断文件的后缀名是否符合规则
        if (isContains(type, extName)) {
            String destPath = getDestPath(userAuditPath, fileName);
            String mapper = getMapperPath(userAuditPath, fileName);
            File dest = new File(destPath);
            if (!dest.getParentFile().exists()) {
                dest.getParentFile().mkdirs();
            }
            file.transferTo(dest);
            return mapper;

        } else {
            throw new RRException("文件格式不符合要求");
        }
    }
//    /**
//     * 改变上传文件的名称，使用uuid
//     *
//     * @param file
//     * @param userAuditPath
//     * @param type
//     * @return
//     * @throws RRException
//     * @throws IOException
//     */
//    public static String saveFileChangeName(MultipartFile file, String userAuditPath, FileType type) throws RRException, IOException {
//        if (null == file || file.isEmpty()) {
//            throw new RRException("上传的文件对象不存在");
//        }
//
//        // 文件名
//        String fileName = file.getOriginalFilename();
//        // 文件后缀名
//        String extName = FilenameUtils.getExtension(fileName);
//        if (StringUtils.isEmpty(extName)) {
//            throw new RRException("文件类型未定义不能上传");
//        }
//        // 判断文件的后缀名是否符合规则
//        if (isContains(type, extName)) {
//            String s = CreateCode.randomId();
//            String destPath = getDestPath(userAuditPath, s + "." + extName);
//            String mapper = getMapperPath(userAuditPath, s + "." + extName);
//            File dest = new File(destPath);
//            if (!dest.getParentFile().exists()) {
//                dest.getParentFile().mkdirs();
//            }
//            file.transferTo(dest);
//            return mapper;
//
//        } else {
//            throw new RRException("文件格式不符合要求");
//        }
//    }
    /**
     * 保存文件
     *
     * @param file       文件
     * @param userAuditPath 用户id
     * @param type       文件类型
     * @return 文件的映射地址
     * @throws IOException
     */
    public static String saveFile(File file, String userAuditPath, FileType type) throws RRException {
        if (null == file) {
            throw new RRException("上传的文件对象不存在");
        }

        // 文件名
        String fileName = file.getName();
        // 文件后缀名
        String extName = FilenameUtils.getExtension(fileName);
        if (StringUtils.isEmpty(extName)) {
            throw new RRException("文件类型未定义不能上传");
        }
        // 判断文件的后缀名是否符合规则
        if (isContains(type, extName)) {
            String destPath = getDestPath(userAuditPath, fileName);
            String mapper = getMapperPath(userAuditPath, fileName);
            File dest = new File(destPath);
            if (!dest.getParentFile().exists()) {
                dest.getParentFile().mkdirs();
            }
            return mapper;

        } else {
            throw new RRException("文件格式不符合要求");
        }
    }

    /**
     * 获取映射路径
     *
     * @param userAuditPath 用户id
     * @param fileName   文件名称
     * @return
     */
    public static String getMapperPath(String userAuditPath, String fileName) {
        String date = DateUtils.format(new Date(), DateUtils.DATE_PATTERN);

        return MessageFormat.format("{0}{1}/{2}/{3}", mapperPath, userAuditPath, date, fileName);
    }

    /**
     * 配置图片存储规则
     *
     * @param userAuditPath 用户id
     * @param fileName   文件名称
     * @return
     */
    public static String getDestPath(String userAuditPath, String fileName) {

        String date = DateUtils.format(new Date(), DateUtils.DATE_PATTERN);

        return MessageFormat.format("{0}{1}/{2}/{3}", realPath, userAuditPath, date, fileName);
    }

    /**
     * 校验文件类型
     *
     * @param type
     * @param extName
     * @return
     */
    private static boolean isContains(FileType type, String extName) {
        switch (type) {
            case IMG_FILE:
                return imgTypeList.contains(extName.toLowerCase());
            case WORD_FILE:
                return wordTypeList.contains(extName.toLowerCase());
            case ANY_FILE:
                return true;
            default:
                return false;

        }
    }

    /**
     * @Name: 上传文件类型
     * @Description:
     * @Author: wzp12
     * @Params:
     * @Return:
     * @CreateDate: 2019/4/26
     */
    public enum FileType {
        IMG_FILE,
        WORD_FILE,
        ANY_FILE
    }

    /**
     * 删除上传的文件
     *
     * @param mapperFilePath 文件映射路径
     * @return boolean
     */
    public static boolean deleteFile(String mapperFilePath) {
        //获得绝对路径
        String realFilePath = mapperFilePath.replace(mapperPath, realPath);
        //根据绝对路径删除文件
        File dest = new File(realFilePath);
        return dest.delete();
    }

}
